package top.wecreate.snet.demo;

import java.util.List;
import java.util.Map;

import top.wecreate.snet.SnetBaseConnection;
import top.wecreate.snet.SnetLocalTestResponse;

/**
 * 继承SnetBaseConnection，填充正确的结果类型和出错时的结果类型。
 * <p>
 * 为了隐藏网络层的处理细节，建议覆写processExceptionBackground，processResponseBackground，
 * fillTestException，fillTestResponse 这四个抽象方法。这四个方法都是在非UI线程中执行的，因此可以进行耗时操作。
 * <p>
 * 还有两个抽象方法是：onSuccess 和 onFail。这两个方法可根据实际需要覆写。这两个方法都是在UI线程中执行的。
 * 
 * @author dell
 * 
 */
// 两个虚类型，分别用于正确的结果类型和出错时的结果类型。
public abstract class DemoSnetConnection extends
		SnetBaseConnection<String, DemoErroInfo> {

	public DemoSnetConnection(ConnetionBuilder builder) {
		super(builder);
	}

	// 在非UI线程中，对异常结果进行处理。
	@Override
	protected void processExceptionBackground(Exception e) {
		// 。。。处理数据结果， 比如转化为自定义的bean。
		DemoErroInfo erroInfo = new DemoErroInfo();
		erroInfo.msg = e.toString();
		// 最后调用setFailResult方法设置最后失败的值
		setFailResult(erroInfo);
	}

	// 在非UI线程中，对返回结果进行处理。
	@Override
	protected void processResponseBackground(int responseCode,
			Map<String, List<String>> responseHeaders, byte[] responseBody) {
		if (responseCode == 200) {
			// 网络返回值正确，处理后设置正确的值
			// 处理数据结果，比如转化为自定义的bean。比如进行耗时的操作：存数据库之类
			// 。。。
			// 最后调用setSuccessResult方法设置最后成功的值
			setSuccessResult(new String(responseBody));
		} else {
			// 不对，处理后设置错误的值。
			DemoErroInfo erroInfo = new DemoErroInfo();
			erroInfo.msg = "网络错误";
			setFailResult(erroInfo);
		}
	}

	// 在非UI线程中，使用本地离线数据测试异常情况，可以自定义异常情况
	// 当SnetConfig中的isUseLocalTest开启时，才会回调此方法。
	@Override
	protected Exception fillTestException() {
		return new Exception("test exception");
	}

	// 在非UI线程中，使用本地离线数据测试正常返回。
	// 当SnetConfig中的isUseLocalTest开启时，才会回调此方法。
	// 如果传null，会传递一个NullPointException对象到processExceptionBackground中。
	@Override
	protected SnetLocalTestResponse fillTestResponse() {
		SnetLocalTestResponse response = new SnetLocalTestResponse();
		response.setCode(200);
		response.setBody(new String("test response").getBytes());
		return response;
	}

}
